package com.keldor.controller;


import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;
import javax.xml.ws.Response;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import com.keldor.model.Articulo;
import com.keldor.model.ArticuloCarrito;
import com.keldor.model.Familia;
import com.keldor.model.Historial;
import com.keldor.model.Menu;
import com.keldor.model.NewArticulo;
import com.keldor.model.NewUsuario;
import com.keldor.model.RelacionFamilia;
import com.keldor.model.Usuario;
import com.keldor.model.UsuarioRol;
import com.keldor.service.ArticuloService;
import com.keldor.service.UsuarioService;




@Controller
@RequestMapping("/servicios")
public class ServiciosController {
	@Autowired
	private ArticuloService articuloService;
	@Autowired
	private UsuarioService usuarioService;
	
	
	//devuelve toda las familias o articulos necesarios
		@RequestMapping(value="/getAdelante.htm",method=RequestMethod.POST)
		        public @ResponseBody String getAdelante(@ModelAttribute(value="familia") Familia familia, BindingResult result ){
						Menu menu = new Menu();
						System.out.println(familia.getCod_familia());
						if (!articuloService.getFamilia(familia.getCod_familia()).getNodo().equals("final")) {
							if(articuloService.tieneSubFamilias(familia.getCod_familia())){
								menu.setFamilias(articuloService.getSubFamilias(familia.getCod_familia()));
								menu.setTieneSubFamilias(true);
							}
						} else {

							menu.setArticulos(articuloService.getArticulos(familia.getCod_familia()));
							List<Integer> stocks= new ArrayList<Integer>();
							for (int i = 0; i < menu.getArticulos().size(); i++) {
								stocks.add(articuloService.getStock(menu.getArticulos().get(i).getCod_articulo()));
							}
							menu.setStocks(stocks);
							menu.setTieneSubFamilias(false);
						}
						Gson gson = new Gson();
						return gson.toJson(menu);

		        }
		//devuelve toda las familias o articulos necesarios
				@RequestMapping(value="/getAtras.htm",method=RequestMethod.POST)
				        public @ResponseBody String getAtras(@ModelAttribute(value="familia") Familia familia, BindingResult result ){
								Menu menu = new Menu();
								Integer idFamiliaPadre = articuloService.getIdFamiliaPadre(familia.getCod_familia());
								System.out.println("Padre="+idFamiliaPadre);
								if(idFamiliaPadre!=(-1)){
									//List<Familia> familias = articuloService.getSubFamilias(idFamiliaPadre);
									List<Familia> familias = articuloService.getMismaSubFamilias(idFamiliaPadre);
									System.out.println(familias);
									menu.setFamilias(familias);
									menu.setTieneSubFamilias(true);
									menu.setEsRaiz(false);
									Gson gson = new Gson();
									return gson.toJson(menu);
								}	else {
									System.out.println(familia.getCod_familia());
									List<Familia> familias = articuloService.getFamilias();
									menu.setFamilias(familias);
									menu.setTieneSubFamilias(true);
									menu.setEsRaiz(true);
									Gson gson = new Gson();
									return gson.toJson(menu);
								}
				        }
				//devuelve toda las familias o articulos necesarios
				@RequestMapping(value="/getAtrasArticulo.htm",method=RequestMethod.POST)
				        public @ResponseBody String getAtrasArticulo(@ModelAttribute(value="familia") Familia familia, BindingResult result ){
								Menu menu = new Menu();
								Integer idFamiliaPadre = articuloService.getIdFamiliaPadre(familia.getCod_familia());
								if(idFamiliaPadre!=(-1)){
									//List<Familia> familias = articuloService.getSubFamilias(idFamiliaPadre);
									List<Familia> familias = articuloService.getMismaSubFamilias(familia.getCod_familia());
									menu.setFamilias(familias);
									menu.setTieneSubFamilias(true);
									menu.setEsRaiz(false);
									Gson gson = new Gson();
									return gson.toJson(menu);
								}	else {
									System.out.println(familia.getCod_familia());
									List<Familia> familias = articuloService.getFamilias();
									menu.setFamilias(familias);
									menu.setTieneSubFamilias(true);
									menu.setEsRaiz(true);
									Gson gson = new Gson();
									return gson.toJson(menu);
								}
				        }	
		
	
//	//devuelve toda las subfamilias de la familia escogida
//	@RequestMapping(value="/getSubFamilias.htm",method=RequestMethod.POST)
//	        public @ResponseBody String getSubFamilias(@ModelAttribute(value="familia") Familia familia, BindingResult result ){
//					List<SubFamilia> subFamilias = articuloService.getSubFamilias(familia.getCod_familia());
//					System.out.println("subfamilias");
//					Gson gson = new Gson();
//					return gson.toJson(subFamilias);
//
//	        }
//	
//	//devuelve toda las subfamilias que comparten la misma familia padre de la subfamilia elegida.
//	@RequestMapping(value="/getMismasSubFamilias.htm",method=RequestMethod.POST)
//	        public @ResponseBody String getMismaSubFamilias(@ModelAttribute(value="subFamilia") SubFamilia subFamilia, BindingResult result ){
//					List<SubFamilia> subFamilias = articuloService.getMismaSubFamilias(subFamilia.getCod_subfamilia());
//					System.out.println("mismas subfamilias");
//					Gson gson = new Gson();
//					return gson.toJson(subFamilias);
//
//	        }
	
	
	@RequestMapping(value="/getFamilias.htm",method=RequestMethod.GET)
    public @ResponseBody String getFamilias(){
			List<Familia> Familia = articuloService.getFamilias();
			Gson gson = new Gson();
			return gson.toJson(Familia);

    }
	
	
//	@RequestMapping(value="/getArticulos.htm",method=RequestMethod.POST)
//    public @ResponseBody String getArticulos(@ModelAttribute(value="subFamilia") SubFamilia subFamilia, BindingResult result ){
//			List<Articulo> articulos = articuloService.getArticulos(subFamilia.getCod_subfamilia());
//			System.out.println("articulos");
//			Gson gson = new Gson();
//			return gson.toJson(articulos);
//
//    }
	
	@RequestMapping(value="enviarCarrito", method = RequestMethod.POST)
	public @ResponseBody String  getRequest(@RequestBody String otzara) {
		Gson gson = new Gson();
		System.out.println(otzara);
		Type collectionType = new TypeToken<List<ArticuloCarrito>>(){}.getType();
		List<ArticuloCarrito> carrito = gson.fromJson(otzara, collectionType);
		List<Historial> historial = new ArrayList<Historial>();
		User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		int id_user = usuarioService.getUsuarioUsuario(user.getUsername()).getId_usuario();
		for (int i = 0; i < carrito.size(); i++) {
			Historial histo = new Historial();
			histo.setCantidad(Integer.parseInt(carrito.get(i).getCantidad()));
			histo.setCod_articulo(Integer.parseInt(carrito.get(i).getId_articulo()));
			histo.setFecha(null);			
			histo.setId_usuario(id_user);
			if(Integer.parseInt(carrito.get(i).getCantidad())>0){
				histo.setTipo_movimiento("REPONER");
			} else {
				histo.setTipo_movimiento("RETIRAR");
			}
			historial.add(histo);
			//actualizar Stock
			articuloService.actualizarStock(Integer.parseInt(carrito.get(i).getId_articulo()), Integer.parseInt(carrito.get(i).getCantidad()));
		}
		articuloService.setCarritoHistorial(historial);
		System.out.println(carrito);
		return "OK";
	}
	
	//devuelve toda las familias o articulos necesarios
	@RequestMapping(value="/getAdelanteAdmin.htm",method=RequestMethod.POST)
	public @ResponseBody String getAdelanteAdmin(@ModelAttribute(value="familia") Familia familia, BindingResult result ){
	Menu menu = new Menu();
	System.out.println(familia.getCod_familia());
	if (!articuloService.getFamilia(familia.getCod_familia()).getNodo().equals("final")) {
		menu.setFamilias(articuloService.getSubFamilias(familia.getCod_familia()));
		menu.setTieneSubFamilias(true);
	} else {
		menu.setArticulos(articuloService.getArticulos(familia.getCod_familia()));
		List<Integer> stocks= new ArrayList<Integer>();
		for (int i = 0; i < menu.getArticulos().size(); i++) {
			stocks.add(articuloService.getStock(menu.getArticulos().get(i).getCod_articulo()));
		}
		menu.setStocks(stocks);
		menu.setTieneSubFamilias(false);
	}
	Gson gson = new Gson();
	return gson.toJson(menu);

	}
	//devuelve un articulo
		@RequestMapping(value="/getArticuloAdmin/{cod_articulo}",method=RequestMethod.GET)
		public @ResponseBody String getArticuloAdmin(@PathVariable String cod_articulo){
			Gson gson = new Gson();
			return gson.toJson(articuloService.getArticulo(Integer.parseInt(cod_articulo)));

		}
	//devuelve un Usuario
	@RequestMapping(value="/getUsuarioAdmin/{id_usuario}",method=RequestMethod.GET)
	public @ResponseBody String getUsuarioAdmin(@PathVariable String id_usuario){
		Gson gson = new Gson();
		return gson.toJson(usuarioService.getUsuarioRol(Integer.parseInt(id_usuario)));
	}
	//Devuelve Stock y precio total de una familia seleccionada
	@RequestMapping(value="/getFamiliaStock/{cod_familia}",method=RequestMethod.GET)
	public @ResponseBody String getFamiliaStockValor(@PathVariable String cod_familia){
		JsonObject json = new JsonObject();
		json.addProperty("familia", articuloService.getFamilia(Integer.parseInt(cod_familia)).getNombre());
		json.addProperty("valor",String.valueOf(articuloService.getValorFamilia(Integer.parseInt(cod_familia))));
		json.addProperty("stock",String.valueOf(articuloService.getStockFamilia(Integer.parseInt(cod_familia))));	
		return json.toString();

	}
	//Update de un articulo concreto, precio y stock
	@RequestMapping(value="/updateArticulo.htm",method=RequestMethod.POST)
	public @ResponseBody String getArticuloAdmin(@ModelAttribute(value="articulo") Articulo articulo, BindingResult result){
		System.out.println(articulo.getPrecio()+" "+articulo.getCod_articulo()+articulo.getStock());
		Gson gson = new Gson();
		return gson.toJson(articuloService.actualizarArticulo(articulo));

	}
	
	//Nuevo articulo
		@RequestMapping(value="/nuevoArticulo.htm",method=RequestMethod.POST)
		public @ResponseBody String nuevoAdmin(@ModelAttribute(value="newArticulo") NewArticulo newArticulo, BindingResult result){
			Articulo articulo = new Articulo();
			JsonObject json = new JsonObject();
			if(!articuloService.existArticuloNombre(newArticulo.getNombre())){
				articulo.setNombre(newArticulo.getNombre());
				articulo.setPrecio(newArticulo.getPrecio());
				articulo.setStock(newArticulo.getStock());
				articulo.setId_almacen(1);
				articuloService.nuevaRelFamiliaArticulo(articuloService.nuevoArticulo(articulo).getCod_articulo(), newArticulo.getCod_familia());
				json.addProperty("respuesta", "Articulo introducido correctamente");
				json.addProperty("valido", true);
				return json.toString();	
			} else {
				json.addProperty("respuesta", "El nombre del articulo no es valido");
				json.addProperty("valido", false);
				return json.toString();	
			}
			
		}
		//Nuevo Usuario
				@RequestMapping(value="/nuevoUsuario.htm",method=RequestMethod.POST)
				public @ResponseBody String nuevoUsuario(@ModelAttribute(value="newUsuario") NewUsuario newUsuario, BindingResult result){
					Usuario usuario = new Usuario();
					JsonObject json = new JsonObject();
					if(!usuarioService.existUsuario(usuario.getUsuario())){
						usuario.setNombre(newUsuario.getNombre());
						usuario.setApellido(newUsuario.getApellido());
						usuario.setUsuario(newUsuario.getUsuario());
						usuario.setPassword(newUsuario.getPassword());
						usuario.setId_almacen(1);
						usuario.setEnabled(1);
						usuarioService.nuevaRelRolUsuario(usuarioService.nuevoUsuario(usuario).getId_usuario(), newUsuario.getRol());
						json.addProperty("respuesta", "Usuario introducido correctamente");
						json.addProperty("valido", true);
						return json.toString();	
					} else {
						json.addProperty("respuesta", "El usuario del articulo no es valido");
						json.addProperty("valido", false);
						return json.toString();	
					}
					
				}
				@RequestMapping(value="/cambiarUsuario.htm",method=RequestMethod.POST)
				public @ResponseBody String cambiarUsuario(@ModelAttribute(value="newUsuario") UsuarioRol newUsuario, BindingResult result, @RequestParam("id") String id){
					Gson gson = new Gson();
					usuarioService.actualizarUsuarioRol(newUsuario, Integer.parseInt(id));
					System.out.println(""+id+"kaixo"+newUsuario.toString());
						return "true";	
					
					
				}
	
}

